R-Version: [Default] [32-bit] C:\Program Files\R\R-4.1.0

In folgendem Notebook werden anhand des MovieLense Datensatzes aus dem Paket RecommenderLab verschiedene Recommender erstellt. Es werden verschiedene Recommender und verschiedene Ähnlichkeiten verwendet, um diese zu vergleichen und auszuwerten. Ziel ist es, ein möglichst guter Recommender zu erstellen und zu verstehen wie dieser funktioniert. Zudem soll verstanden werden wie dieser bewertet wird und was in diesem Falle ein ‘guter’ Recommender bedeutet.

Dieses Notebook konzentriert sich auf Erkenntnisse von Auswertungen und Vergleichen. Um eine bessere Übersicht zu erhalten wurden grosse, sich widerholende Codes im Helperfile helper.R ausgelagert.

Binäre User-Liked-Items Matrix für alle Nutzer erzeugen

movies_binary <- movies %>% mutate(rating = ifelse(rating > 3, 1, 0))
movies_wider <- pivot_wider(movies_binary, id_cols = user, names_from = item, values_from = rating)
matrix <- as.matrix(movies_wider)
movies_wider

Für die Binäre User-Liked Matrix setzten wir die Grenze für ein gutes Rating bei >4. Also alle Filme, welche mit einem Rating von 3 oder weniger bewertet wurden, werden als schlecht bewertet definiert (also 0), wobei Filme mit Bewertungen von 4 oder 5 als gut bewertet definiert sind (1).

Ähnlichkeit von Nutzern und Filmen

Test


A_test.data <- c(1,2,0,2,1,0,1,2,1)
A_test <- matrix(A_test.data, nrow=3)
A_test
     [,1] [,2] [,3]
[1,]    1    2    1
[2,]    2    1    2
[3,]    0    0    1
B_test.data <- c(1,2,0,2,1,0,1,2,1)
B_test <- matrix(B_test.data, nrow=3)
B_test
     [,1] [,2] [,3]
[1,]    1    2    1
[2,]    2    1    2
[3,]    0    0    1
result <- calc_cos_similarity_twomtrx(A_test, B_test)

if((dim(result) == dim(B_test)) && (dim(result) == dim(A_test))) {
  print("dimensions match")
} else {
  print("dimensions do not match")
}
[1] "dimensions match"
result
          [,1]      [,2]      [,3]
[1,] 1.0000000 0.8164966 0.4082483
[2,] 0.8164966 1.0000000 0.6666667
[3,] 0.4082483 0.6666667 1.0000000

Wie in diesem Beispiel ersichtlich wird, ist die Matrix symmetrisch…


similarity <- calc_cos_similarity_twomtrx(user_genre, movie_genre)
Fehler in calc_cos_similarity_twomtrx(user_genre, movie_genre) : 
  Objekt 'user_genre' nicht gefunden
summary(similarity)
Fehler in object[[i]] : Objekt des Typs 'closure' ist nicht indizierbar
plot_sim(similarity, "cosine similarity matrix between user-genre and movie-genre")
Fehler in UseMethod("levelplot") : 
  nicht anwendbare Methode für 'levelplot' auf Objekt der Klasse "c('standardGeneric', 'genericFunction', 'function', 'OptionalFunction', 'PossibleMethod', 'optionalMethod')" angewendet
selection <- similarity[c(241, 414, 477, 526, 640, 710), ]
Fehler in similarity[c(241, 414, 477, 526, 640, 710), ] : 
  Objekt des Typs 'closure' ist nicht indizierbar
movies_wider

Empfehlbare Filme

1. Bewertete Filme maskieren, d.h. “Negativabzug” der User-Items Matrix erzeugen, um anschliessend Empfehlungen herzuleiten.

movies_masked <- movies_wider
movies_masked[-1][movies_masked[-1] == 1] <- 0
movies_masked[is.na(movies_masked)] <- 1
movies_masked

2. Zeilensumme des “Negativabzuges” der User-Items Matrix für die User “5”, “25”, “50” und “150” ausgeben.

defined_user <- c(5, 25, 50, 150)
rowSums(movies_masked[defined_user, -1])
[1] 1489 1586 1641 1633

3. 5-Zahlen Statistik der Zeilensumme des “Negativabzuges” der User-Items Matrix bestimmen.

rowsums_masked <- rowSums(movies_masked[, -1])
summary(rowsums_masked)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    929    1516    1600    1559    1632    1645 

Top-N Empfehlungen

1.Matrix für Bewertung aller Filme durch element-weise Multiplikation derMatrix der Cosinus-Ähnlichkeiten von Nutzern und Filmen und “Negativabzug” der User-Items Matrix erzeugen.

2.Dimension der Matrix für die Bewertung aller Filme prüfen.

3.Top-20 Listen pro Nutzer extrahieren.

4.Länge der Top-20 Listen pro Nutzer prüfen.

##5.Verteilung der minimalen Ähnlichkeit für Top-N Listen für N = 10, 20, 50 und 100 für alle Nutzer visuell vergleichen.

##6.Top-20 Empfehlungen für Nutzer “5”, “25”, “50” und “150” visuell evaluieren.

##7.Für Nutzer “133” und “555” Profil mit Top-N Empfehlungen für N = 20, 30, 40, 50 analysieren, visualisieren und diskutieren.

LS0tCnRpdGxlOiAiQ29udGVudC1iYXNlZCBSZWNvbW1lbmRlciIKYXV0aG9yOiAiUGFzY2FsIEJlcmdlciwgTGVhIELDvHRsZXIgJiBKb8OrbCBHcm9zamVhbiIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tClItVmVyc2lvbjogKipbRGVmYXVsdF0gWzMyLWJpdF0gQzpcXFByb2dyYW0gRmlsZXNcXFJcXFItNC4xLjAqKgoKSW4gZm9sZ2VuZGVtIE5vdGVib29rIHdlcmRlbiBhbmhhbmQgZGVzIGBNb3ZpZUxlbnNlYCBEYXRlbnNhdHplcyBhdXMgZGVtIFBha2V0IFJlY29tbWVuZGVyTGFiIHZlcnNjaGllZGVuZSBSZWNvbW1lbmRlciBlcnN0ZWxsdC4gRXMgd2VyZGVuIHZlcnNjaGllZGVuZSBSZWNvbW1lbmRlciB1bmQgdmVyc2NoaWVkZW5lIMOEaG5saWNoa2VpdGVuIHZlcndlbmRldCwgdW0gZGllc2UgenUgdmVyZ2xlaWNoZW4gdW5kIGF1c3p1d2VydGVuLiBaaWVsIGlzdCBlcywgZWluIG3DtmdsaWNoc3QgZ3V0ZXIgUmVjb21tZW5kZXIgenUgZXJzdGVsbGVuIHVuZCB6dSB2ZXJzdGVoZW4gd2llIGRpZXNlciBmdW5rdGlvbmllcnQuIFp1ZGVtIHNvbGwgdmVyc3RhbmRlbiB3ZXJkZW4gd2llIGRpZXNlciBiZXdlcnRldCB3aXJkIHVuZCB3YXMgaW4gZGllc2VtIEZhbGxlIGVpbiAnZ3V0ZXInIFJlY29tbWVuZGVyIGJlZGV1dGV0LgoKRGllc2VzIE5vdGVib29rIGtvbnplbnRyaWVydCBzaWNoIGF1ZiBFcmtlbm50bmlzc2Ugdm9uIEF1c3dlcnR1bmdlbiB1bmQgVmVyZ2xlaWNoZW4uIFVtIGVpbmUgYmVzc2VyZSDDnGJlcnNpY2h0IHp1IGVyaGFsdGVuIHd1cmRlbiBncm9zc2UsIHNpY2ggd2lkZXJob2xlbmRlIENvZGVzIGltIEhlbHBlcmZpbGUgYGhlbHBlci5SYCBhdXNnZWxhZ2VydC4KCmBgYHtyIGVjaG89RkFMU0UsIGNhY2hlPUZBTFNFLCByZXN1bHRzPUZBTFNFLCBjb21tZW50PUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIG7DtnRpZ2UgUGFja2V0ZQpwYWNrYWdlcyA8LSBjKCJ0aWR5dmVyc2UiLCAiZGF0YS50YWJsZSIsICJsdWJyaWRhdGUiLCAiZ2dwbG90MiIsICJnZ3RoZW1lcyIsICJyZWNvbW1lbmRlcmxhYiIsICJrbml0ciIsICdwYWxzJywgJ1JDb2xvckJyZXdlcicsICdsYXR0aWNlJywgJ2dyaWQnLCAnZ3JpZEV4dHJhJykKCiMgTm9jaCBuaWNodCBpbnN0YWxsaWVydGUgUGFrZXRlIGluc3RhbGxpZXJlbgppbnN0YWxsZWRfcGFja2FnZXMgPC0gcGFja2FnZXMgJWluJSByb3duYW1lcyhpbnN0YWxsZWQucGFja2FnZXMoKSkKCmlmIChhbnkoaW5zdGFsbGVkX3BhY2thZ2VzID09IEZBTFNFKSkgewogIGluc3RhbGwucGFja2FnZXMocGFja2FnZXNbIWluc3RhbGxlZF9wYWNrYWdlc10pCn0KCiMgTGFkZW4gZGVyIFBhY2tldGUKaW52aXNpYmxlKGxhcHBseShwYWNrYWdlcywgbGlicmFyeSwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKSkKCiMgSW1wb3J0aWVyZW4gdm9uIEZ1bmt0aW9uZW5lIGF1cyBoZWxwZXIgZmlsZQpzb3VyY2UoImhlbHBlci5SIikKCiMgY2hhbmdlIG9wdGlvbnMKb3B0aW9ucyhkcGx5ci5zdW1tYXJpc2UuaW5mb3JtID0gRkFMU0UpCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkYXRhIHdyYW5nbGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRGF0ZW4gaW1wb3J0aWVyZW4KZGF0YShNb3ZpZUxlbnNlKQoKIyBkYXRhZnJhbWUgZXJzdGVsbGVuCm1vdmllcyA8LSBhcyhNb3ZpZUxlbnNlLCAiZGF0YS5mcmFtZSIpCm1vdmllcyA8LSBtb3ZpZXMgJT4lIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLmZhY3RvcikKCiMgYnJlaXRlIHZlcnNpb24gZGVzIGRhdGFmcmFtZSBlcnN0ZWxsZW4KIyBtb3ZpZXNfd2lkZXIgPC0gcGl2b3Rfd2lkZXIoCiMgICBtb3ZpZXMsCiMgICBpZF9jb2xzID0gdXNlciwKIyAgIG5hbWVzX2Zyb20gPSBpdGVtLAojICAgdmFsdWVzX2Zyb20gPSByYXRpbmcsCiMgICB2YWx1ZXNfZmlsbCA9IE5VTEwsCiMgKQpgYGAKCiMjIEJpbsOkcmUgVXNlci1MaWtlZC1JdGVtcyBNYXRyaXggZsO8ciBhbGxlIE51dHplciBlcnpldWdlbgpgYGB7cn0KbW92aWVzX2JpbmFyeSA8LSBtb3ZpZXMgJT4lIG11dGF0ZShyYXRpbmcgPSBpZmVsc2UocmF0aW5nID4gMywgMSwgMCkpCm1vdmllc193aWRlciA8LSBwaXZvdF93aWRlcihtb3ZpZXNfYmluYXJ5LCBpZF9jb2xzID0gdXNlciwgbmFtZXNfZnJvbSA9IGl0ZW0sIHZhbHVlc19mcm9tID0gcmF0aW5nKQptYXRyaXggPC0gYXMubWF0cml4KG1vdmllc193aWRlcikKbW92aWVzX3dpZGVyCmBgYApGw7xyIGRpZSBCaW7DpHJlIFVzZXItTGlrZWQgTWF0cml4IHNldHp0ZW4gd2lyIGRpZSBHcmVuemUgZsO8ciBlaW4gZ3V0ZXMgUmF0aW5nIGJlaSA+NC4gQWxzbyBhbGxlIEZpbG1lLCB3ZWxjaGUgbWl0IGVpbmVtIFJhdGluZyB2b24gMyBvZGVyIHdlbmlnZXIgYmV3ZXJ0ZXQgd3VyZGVuLCB3ZXJkZW4gYWxzIHNjaGxlY2h0IGJld2VydGV0IGRlZmluaWVydCAoYWxzbyAwKSwgd29iZWkgRmlsbWUgbWl0IEJld2VydHVuZ2VuIHZvbiA0IG9kZXIgNSBhbHMgZ3V0IGJld2VydGV0IGRlZmluaWVydCBzaW5kICgxKS4KCgojIyDDhGhubGljaGtlaXQgdm9uIE51dHplcm4gdW5kIEZpbG1lbgoKIyMjIFRlc3QKCmBgYHtyfQoKQV90ZXN0LmRhdGEgPC0gYygxLDIsMCwyLDEsMCwxLDIsMSkKQV90ZXN0IDwtIG1hdHJpeChBX3Rlc3QuZGF0YSwgbnJvdz0zKQpBX3Rlc3QKCkJfdGVzdC5kYXRhIDwtIGMoMSwyLDAsMiwxLDAsMSwyLDEpCkJfdGVzdCA8LSBtYXRyaXgoQl90ZXN0LmRhdGEsIG5yb3c9MykKQl90ZXN0CgpyZXN1bHQgPC0gY2FsY19jb3Nfc2ltaWxhcml0eV90d29tdHJ4KEFfdGVzdCwgQl90ZXN0KQoKaWYoKGRpbShyZXN1bHQpID09IGRpbShCX3Rlc3QpKSAmJiAoZGltKHJlc3VsdCkgPT0gZGltKEFfdGVzdCkpKSB7CiAgcHJpbnQoImRpbWVuc2lvbnMgbWF0Y2giKQp9IGVsc2UgewogIHByaW50KCJkaW1lbnNpb25zIGRvIG5vdCBtYXRjaCIpCn0KCnJlc3VsdAoKYGBgCgpXaWUgaW4gZGllc2VtIEJlaXNwaWVsIGVyc2ljaHRsaWNoIHdpcmQsIGlzdCBkaWUgTWF0cml4IHN5bW1ldHJpc2NoLi4uCgoKYGBge3J9CgpzaW1pbGFyaXR5IDwtIGNhbGNfY29zX3NpbWlsYXJpdHlfdHdvbXRyeCh1c2VyX2dlbnJlLCBtb3ZpZV9nZW5yZSkKCmBgYAoKYGBge3J9CnN1bW1hcnkoc2ltaWxhcml0eSkKYGBgCgoKYGBge3J9CnBsb3Rfc2ltKHNpbWlsYXJpdHksICJjb3NpbmUgc2ltaWxhcml0eSBtYXRyaXggYmV0d2VlbiB1c2VyLWdlbnJlIGFuZCBtb3ZpZS1nZW5yZSIpCmBgYAoKCmBgYHtyfQpzZWxlY3Rpb24gPC0gc2ltaWxhcml0eVtjKDI0MSwgNDE0LCA0NzcsIDUyNiwgNjQwLCA3MTApLCBdCgpwbG90X3NpbShzZWxlY3Rpb24sICJjb3NpbmUgc2ltaWxhcml0eSB1c2VyLWdlbnJlIGFuZCBtb3ZpZS1nZW5yZSBzZWxlY3Rpb24iKQoKYGBgCmBgYHtyfQptb3ZpZXNfd2lkZXIKYGBgCgojIyMgRW1wZmVobGJhcmUgRmlsbWUKIyMgMS4gQmV3ZXJ0ZXRlIEZpbG1lIG1hc2tpZXJlbiwgZC5oLiDigJxOZWdhdGl2YWJ6dWfigJ0gZGVyIFVzZXItSXRlbXMgTWF0cml4IGVyemV1Z2VuLCB1bSBhbnNjaGxpZXNzZW5kIEVtcGZlaGx1bmdlbiBoZXJ6dWxlaXRlbi4KYGBge3J9Cm1vdmllc19tYXNrZWQgPC0gbW92aWVzX3dpZGVyCm1vdmllc19tYXNrZWRbLTFdW21vdmllc19tYXNrZWRbLTFdID09IDFdIDwtIDAKbW92aWVzX21hc2tlZFtpcy5uYShtb3ZpZXNfbWFza2VkKV0gPC0gMQptb3ZpZXNfbWFza2VkCmBgYAoKIyMgMi4gWmVpbGVuc3VtbWUgZGVzIOKAnE5lZ2F0aXZhYnp1Z2Vz4oCdIGRlciBVc2VyLUl0ZW1zIE1hdHJpeCBmw7xyIGRpZSBVc2VyIOKAnDXigJ0sIOKAnDI14oCdLCDigJw1MOKAnSB1bmQg4oCcMTUw4oCdIGF1c2dlYmVuLgpgYGB7cn0KZGVmaW5lZF91c2VyIDwtIGMoNSwgMjUsIDUwLCAxNTApCnJvd1N1bXMobW92aWVzX21hc2tlZFtkZWZpbmVkX3VzZXIsIC0xXSkKYGBgCgoKIyMgMy4gNS1aYWhsZW4gU3RhdGlzdGlrIGRlciBaZWlsZW5zdW1tZSBkZXMg4oCcTmVnYXRpdmFienVnZXPigJ0gZGVyIFVzZXItSXRlbXMgTWF0cml4IGJlc3RpbW1lbi4KYGBge3J9CnJvd3N1bXNfbWFza2VkIDwtIHJvd1N1bXMobW92aWVzX21hc2tlZFssIC0xXSkKc3VtbWFyeShyb3dzdW1zX21hc2tlZCkKYGBgCgojIyBUb3AtTiBFbXBmZWhsdW5nZW4KIyMgMS5NYXRyaXggZsO8ciBCZXdlcnR1bmcgYWxsZXIgRmlsbWUgZHVyY2ggZWxlbWVudC13ZWlzZSBNdWx0aXBsaWthdGlvbiBkZXJNYXRyaXggZGVyIENvc2ludXMtw4RobmxpY2hrZWl0ZW4gdm9uIE51dHplcm4gdW5kIEZpbG1lbiB1bmQg4oCcTmVnYXRpdmFienVn4oCdIGRlciBVc2VyLUl0ZW1zIE1hdHJpeCBlcnpldWdlbi4KYGBge3J9CgpgYGAKCiMjIDIuRGltZW5zaW9uIGRlciBNYXRyaXggZsO8ciBkaWUgQmV3ZXJ0dW5nIGFsbGVyIEZpbG1lIHByw7xmZW4uCmBgYHtyfQoKYGBgCgojIyAzLlRvcC0yMCBMaXN0ZW4gcHJvIE51dHplciBleHRyYWhpZXJlbi4KYGBge3J9CgpgYGAKCiMjIDQuTMOkbmdlIGRlciBUb3AtMjAgTGlzdGVuIHBybyBOdXR6ZXIgcHLDvGZlbi4KYGBge3J9CgpgYGAKCiMjNS5WZXJ0ZWlsdW5nIGRlciBtaW5pbWFsZW4gw4RobmxpY2hrZWl0IGbDvHIgVG9wLU4gTGlzdGVuIGbDvHIgTiA9IDEwLCAyMCwgNTAgdW5kIDEwMCBmw7xyIGFsbGUgTnV0emVyIHZpc3VlbGwgdmVyZ2xlaWNoZW4uCmBgYHtyfQoKYGBgCgojIzYuVG9wLTIwIEVtcGZlaGx1bmdlbiBmw7xyIE51dHplciDigJw14oCdLCDigJwyNeKAnSwg4oCcNTDigJ0gdW5kIOKAnDE1MOKAnSB2aXN1ZWxsIGV2YWx1aWVyZW4uCmBgYHtyfQoKYGBgCgojIzcuRsO8ciBOdXR6ZXIg4oCcMTMz4oCdIHVuZCDigJw1NTXigJ0gUHJvZmlsIG1pdCBUb3AtTiBFbXBmZWhsdW5nZW4gZsO8ciBOID0gMjAsIDMwLCA0MCwgNTAgYW5hbHlzaWVyZW4sIHZpc3VhbGlzaWVyZW4gdW5kIGRpc2t1dGllcmVuLgpgYGB7cn0KCmBgYAoK